/**
 * 
 */
package form.validator;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Classe contenant des fonctions utilitaires liées à la validation des données
 * 
 * @author Yannick Lorenzati & Stephanie Malakian
 * 
 */
public class FieldValidatorUtil {

	/**
	 * Permet de savoir si une chaine correspond a un pattern
	 * 
	 * @param str
	 *            Chaine a analyser
	 * @param pattern
	 *            Motif auquelle doit correspondre la chaine
	 * @return True si la chaine correspond au pattern, false sinon
	 */
	private static boolean isMatching(String str, String pattern) {

		Pattern p = Pattern.compile(pattern);
		Matcher m = p.matcher(str);

		if (m.find()) {
			return false;
		}

		return true;
	}

	/**
	 * Fonction permettant de savoir si une chaine est composé de caratere
	 * alphanumerique uniquement
	 * 
	 * @param str
	 *            Chaine a analyser
	 * @return true si la chaine est composé uniquement de caractere
	 *         alphanumerique, false sinon
	 */
	public static boolean isAlphaNumString(String str) {
		return FieldValidatorUtil.isMatching(str, "[^a-zA-Z_0-9-]");
	}

	/**
	 * Fonction permettant d'analyser la taille d'une chaine
	 * 
	 * @param str
	 *            Chaine a analyser
	 * @param minChar
	 *            nombre minimum de caratere que la chaine doit contenir
	 * @param maxChar
	 *            nombre maximum de caratere que la chaine doit contenir
	 * @return true si le nombre de caractere de la chaine est compris entre min
	 *         et max, false sinon
	 */
	public static boolean isGoodLength(String str, int minChar, int maxChar) {

		if (str.length() >= minChar && str.length() <= maxChar) {
			return true;
		}
		return false;
	}

	/**
	 * @param str
	 *            Chaine a analyser
	 * @return
	 */
	public static boolean isAlphaStringWithAccentChar(String str) {
		return FieldValidatorUtil.isMatching(str, "[^a-zA-Z-àéèîâêïçôùû\\s\']");
	}

	/**
	 * @param str
	 *            Chaine a analyser
	 * @return
	 */
	public static boolean isValideAdress(String str) {
		return FieldValidatorUtil.isMatching(str,
				"[^-\\/0-9a-zA-Z-àéèîâêïçôùû\\s,\\.\\(\\)\'\"]");
	}

	/**
	 * Fonction permettant de verifier si la chaine est un email valide
	 * 
	 * @param str
	 *            Chaine a analyser
	 * @return true si la chaine est un email valide, false sinon
	 */
	public static boolean isEmail(String str) {
		return str
				.matches("[a-zA-Z0-9]+([-_\\.]{0,1}[a-zA-Z0-9]+)*@[a-zA-Z0-9]+[\\.][a-zA-Z]{2,3}");
	}

	/**
	 * Fonction permettant de verifier si la chaine est une url valide
	 * 
	 * @param str
	 *            Chaine a analyser
	 * @return true si la chaine est une url valide, false sinon
	 */
	public static boolean isWebUrl(String str) {
		return str.matches("(http://|ftp://){0,1}[www\\.].*");
	}

	/**
	 * Fonction permettant de verifier si l'annee d'une promo est valide
	 * 
	 * @param str
	 *            Chaine a analyser
	 * @return true si la chaine est de la bonne forme, false sinon
	 */
	public static boolean isValidPromoYear(String str) {
		return str.matches("[0-9]+[/][0-9]+");
	}

	/**
	 * Fonction permettant de verifier si un texte (paragraphe, description) est
	 * valide
	 * 
	 * @param str
	 *            Chaine a analyser
	 * @return true si la chaine est de la bonne forme, false sinon
	 */
	public static boolean isValidText(String str) {
		return FieldValidatorUtil.isMatching(str,
				"[^-\\/0-9a-zA-Z-àéèîâêïçôùû\\s,\\.\\(\\)!?;:\'\"]");
	}

}
